#include "drv_spi.h"

/**************************************
函数名：drv_spi2_init
函数功能：初始化SPI2
输入参数：无
输出参数：无
其它：
	//pb12 nss(片选)
	//pb13	clk(时钟线)
	//pb14	miso(主机输入从机输出)
	//pb15	mosi(主机输出从机输入)
****************************************/
void drv_spi2_init(void)
{
	GPIO_InitTypeDef GPIO_InitStruct;//定义GPIO结构体
	SPI_InitTypeDef SPI_InitStruct;//定义SPI结构体
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);//开启GPIOB时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);//开启SPI2时钟
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;//开启复用模式
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//开启推挽输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;//引脚号
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;//上拉操作
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOB, &GPIO_InitStruct);

	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;//74hc595片选设为输出
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_12;
	GPIO_Init(GPIOB, &GPIO_InitStruct);

	GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_SPI2);//指定引脚的服用功能
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource14, GPIO_AF_SPI2);
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource15, GPIO_AF_SPI2);

	SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2;//spi的时钟分频
	SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge;//时钟相位，第二个时钟边沿采样也就是后沿采样
	SPI_InitStruct.SPI_CPOL = SPI_CPOL_High;//时钟极性，空闲时钟线为高
	SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b;//8位数据位
	SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex;//两线全双工
	SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB;//高位先行
	SPI_InitStruct.SPI_Mode = SPI_Mode_Master;//主机模式
	SPI_InitStruct.SPI_NSS = SPI_NSS_Soft;//片选软件控制
	SPI_InitStruct.SPI_CRCPolynomial = 7;//crc校验
	SPI_Init(SPI2, &SPI_InitStruct);
	SPI_Cmd(SPI2, ENABLE);
	NSS_DISABLE;//拉高片选，锁存已接收的数据，驱动数码管显示，结束本次通信，释放催该芯片的控制
}

/**************************************
函数名：drv_spi2_sendata
函数功能：spi2发送数据
输入参数：无
输出参数：无
其它：
	//pb12 nss(片选)
	//pb13	clk(时钟线)
	//pb14	miso(主机输入从机输出)
	//pb15	mosi(主机输出从机输入)
****************************************/
void drv_spi2_sendata(uint8_t data)
{
	while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE)==RESET);//等待上次发送完成后才能继续发送
	SPI_I2S_SendData(SPI2, data);//发送数据
}

